\chapter{インタラクティブモード}
\section{インタラクティブモードとは?}
\indy{いんたらくていふもうと}{インタラクティブモード} --- とは
すなわち対話しながら実行するモードです。竜と対話しながら1行ずつ
実行していきます。

基本的に日本語で入力することになるので、CDragon を使う場合は、
日本語が入力できる端末でなければいけません。もし、X Window
System 環境で端末エミュレータを使っている場合、おそらく通常の方法
と同じ方法で日本語の切替えができるでしょう。また Linux のコンソールでは
jfbterm と Emacs を組み合わせることで入力$\cdot$表示が可能です。
利用可能な組合せを表\ref{japanese_usable_table}にまとめます。

\begin{table}[p]
\centering
\caption{日本語が使える端末一覧}
\label{japanese_usable_table}
\begin{minipage}{\textwidth}
\begin{center}
\begin{tabular}[b]{c|c c}
  \hline
  端末名 \footnote{2010 年 1 月 30 日 現在、UTF-8 環境で調査。} & 日本語表示 & 日本語入力 \\
  \hline
  XTerm (Unicode) & ○ & ○ \\
  Gnome Terminal (Unicode) & ○ & ○ \\
  Konsole (Unicode) & ○ & ○ \\
  (Xfce) Terminal (Unicode) & ○ & ○ \\
  \hline
  Eterm & ○ \footnote{\href{http://www.medias.ne.jp/~ssse_abe/linux/applications/Eterm.html}
  {http://www.medias.ne.jp/\~{}ssse\_abe/linux/applications/Eterm.html}} &
  ○ \footnote{\href{http://homepage3.nifty.com/peterpan/Eterm/handling-JP-problem/index.html}
  {http://homepage3.nifty.com/peterpan/Eterm/handling-JP-problem/index.html}} \\
  KTerm & ○ & ○ \footnote{EUC-JP 環境のみ} \\
  rxvt & ○ & ○ \footnote{EUC-JP 環境のみ} \\
  rxvt (Unicode) & ○ & ○ \\
  \hline
  Emacs (Mule) Shell Mode & --- \footnote{環境に依存する} & ○ \\
  jfbterm & ○ & × \\
  Linux Console & --- \footnote{ハードウェアに依存するが通常は不可} & × \\
  \hline
\end{tabular}\\
{\small ○: 利用可能\footnote{場合によっては設定を必要とする}\qquad ×: 利用不可 \\
環境変数の値などによっては変わる可能性あり。}
\end{center}
\end{minipage}
\end{table}

\section{起動方法}
\texttt{-i} または \verb+--interactive+ オプションをつけて起動します。スクリプト
ファイルが指定されている場合は、それらを実行し終えた状態で対話モードに移行します。
このとき、最後のスクリプトを実行した状態 --- 読み込んだライブラリや変数などを
保持しています。ただし、言語は端末に設定されている言語で入出力ができます。
\begin{lstlisting}
$ cdragon [-i|--interactive]
$ gdragon [-i|--interactive]
$ kdragon [-i|--interactive]
\end{lstlisting}

\section{起動中の操作 --- CDragon の場合}
\subsection{基本}
インタラクティブモードでは、1つの命令を貰っては実行し、その後でまた命令を貰うという
順序で実行されます。つまり、1つ命令を実行する度に停止し、次の命令を待ちます。
ただし、行単位という入力から
\begin{lstlisting}
> 「あ」と言え。「い」と言え。
\end{lstlisting}
などのように1行に2つ以上の命令をした場合は全て実行してから停止します。

\subsection{条件分岐やループの入力方法}
条件分岐やループでは次のような動作をします。
\begin{lstlisting}[name=ifthen]
> もしA=1ならば、
竜: わかったぜよ。
> 		「こんにちは。」と言え。
\end{lstlisting}
理解できない命令の場合、とりあえず保留されます。
実行の対象となる文は面倒でも最初にタブかスペースを1つ入れる必要があります。
入れ子になる場合はさらにタブかスペースを入れます。ここで、スペースを入れなかった
場合、完全な文になりますので実行されてしまいます。
\begin{lstlisting}[name=ifthen]
竜: わかったぜよ。
> 違えば、
竜: わかったぜよ。
> 		「こんばんは。」と言え。
竜: わかったぜよ。
\end{lstlisting}
いままで入力した内容が全部で正しい命令となっていればなにも入力せずに Enter
を押すと実行されます。
\begin{lstlisting}[name=ifthen]
> 
こんにちは。
竜: 命令は成功したぜよ。
\end{lstlisting}

\subsection{間違った命令を入力したとき}
同様に、命令を間違えた時は、次の行で何も入力せずに命令すればキャンセルされます。
\begin{lstlisting}
> 間違えた命令!
竜: わかったぜよ。
>
竜: 「間違えた命令!」は何のことだかわからないぜよ。
\end{lstlisting}

\subsection{成功した命令を取り消す}
成功した命令をキャンセルするには、
\begin{lstlisting}
> 今のは無し!
竜: さっきの命令を取り消したぜよ。
竜: 命令は成功したぜよ。
\end{lstlisting}
と命令してください。直前の命令によって変更された変数が元の値に戻ります。また、
その命令は書き出しを行った時に書き出さなくなります。もちろん、「今のは無し!」
を取り消すことはできません。なお、元に戻せるのは変数のみで、ファイルの作成、
編集、削除や、端末への出力などを取り消すことはできません。

\subsection{命令を記録する}
今までに命令した内容は記録することができます。
\begin{lstlisting}
> ここまでを「out.cds」に記録。
竜: 命令は成功したぜよ。
\end{lstlisting}
この記録命令では Shebang 行は付加しますが \texttt{LANG} 命令は付加しません。
なお、存在するファイルを指定した場合は、次のように聞いてきます。
\begin{lstlisting}
竜: ファイル 「out.cds」は存在するが、どうするか?
	o: 上書きする
	a: 追記する
	x: やっぱりやめる
答え> 
\end{lstlisting}
\texttt{o}、\texttt{a}、\texttt{x} の何れかを入力し、Enter キーを押せば
そのように処理されます。

また、ファイルがバイナリファイルの場合は、
\begin{lstlisting}
竜: ファイル 「out.cds」はバイナリファイルのようだが、どうするか?
	o: 上書きする
	x: やっぱりやめる
答え> 
\end{lstlisting}
の何れかを選択します。

指定したファイル名に拡張子が付いていない場合は、念のため
\begin{lstlisting}
竜: 指定した名前 「out」には拡張子が付いていないが、これで良いのか?
	y: はい。
	n: いや、付けてくれ。
	x: やっぱりやめる
答え> 
\end{lstlisting}
と聞きます。

拡張子が Dragon Script のものでは無い場合は、次のようになります。
\begin{lstlisting}
竜: 指定した名前 「out.txt」は Dragon Script の拡張子ではないが、
これで良いのか?
	y: はい。
	n: いや、変えてくれ。
	x: やっぱりやめる
答え> 
\end{lstlisting}
付けたり変えたりする場合、拡張子は「\texttt{cds}」になります。
GDragon には \texttt{gds} を、KDragon には \texttt{kds} を
使っても構いませんが、いずれも Shebang を元に正しいインタープリタが
使われるようになっていますので、\texttt{cds} を使うことをお薦めします。

\subsection{とにかくうるさい!}
そうですよね。そんな時は、
\begin{lstlisting}
> 黙って作業しろ!
竜: わかりました。以後気をつけます。
\end{lstlisting}
とすれば、結果や成功か否かを報告しなくなります。

\section{起動中の操作 --- GDragon、KDragon の場合}
こちらはダイアログボックスが出現し、そこに命令を書き込んで行きます。ここでは普通に
Enter キーで改行が入力できます。Ctrl を押しながら Enter を押すと実行されます。

なお、
\begin{lstlisting}
$ gdragon -i --like-cdragon
\end{lstlisting}
と \verb+--like-cdragon+ をつけて起動すると CDragon と同じように入力することが
できます。ただし、竜との対話以外にも gtk や KDE のデバッグメッセージが出力されて
いきますので御注意ください。